﻿--- Eliminar las funciones existentes sin importar el numero ni tipo de parametros
SELECT * FROM "DropFunction_AWIL"('FuncOrdTrabajo');
--- crear una nueva funcion
CREATE OR REPLACE FUNCTION "FuncOrdTrabajo"(
	 IN	"@OP" CHARACTER VARYING(64)
	,IN	"@paramAux" TEXT
	,INOUT	"@id" INTEGER
	,INOUT	"@fechaGrab" timestamp
	,INOUT	"@usuarioGrab" character varying(32)
	,INOUT	"@activo" boolean
	,INOUT	"@codOrdTrabajo" character varying(16)
	,INOUT	"@codOperacionInterna" character varying(32)
	,INOUT	"@codResponsable" character varying(32)
	,INOUT	"@codMaeOperacionTipo" character varying(32)
	,INOUT	"@codMaeOperacionPuerto" character varying(16)
	,INOUT	"@codMaeCliente1" character varying(32)
	,INOUT	"@codMaeCliente2" character varying(32)
	,INOUT	"@fechaRegistro" DATE
	,INOUT	"@estado" character varying(16)
	,INOUT	"@codFactura" character varying(32)
	,INOUT	"@valorFactura" NUMERIC(18,2)
	,INOUT 	"@consignatario" character varying(256)

	,INOUT 	"@codMaeOperacionIdent" CHARACTER VARYING(16)
	,INOUT 	"@numero" CHARACTER VARYING(16)
	,INOUT 	"@codMaeContenedorTipo" CHARACTER VARYING(16)
	,INOUT 	"@codMaeMercanciaTipo" CHARACTER VARYING(16)
	,INOUT 	"@observaciones" CHARACTER VARYING(256)
	,INOUT 	"@codMaeContenedorTamano" CHARACTER VARYING(16)		    -- Pendiente Implementar Maestro
	,INOUT 	"@cantidad" NUMERIC(18,2)
	
)RETURNS 
	SETOF RECORD
AS $$ 
DECLARE
	Auxiliar TEXT;
	pagina INTEGER;
	numRegistrosPorPagina INTEGER;
	campoFiltroOrden character varying(64);
	valorFiltro character varying(64);
	isCliente boolean;
BEGIN

	/*FACTURAR OT*/
	IF "@OP"='facturarOrdTrabajoById' THEN
		--- verifico las observaciones
		IF trim("@paramAux")='' THEN
			Auxiliar = 'Debe Digitar las observaciones, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- verifico el estado de la orden
		IF NOT EXISTS (SELECT 1 FROM "OrdTrabajo" WHERE "id"="@id" and "estado"='CERRADA') THEN
			Auxiliar = 'La orden de Trabajo debe estar CERRADA, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- verifico el numero de la factura
		IF trim("@codFactura")='' THEN
			Auxiliar = 'Debe ingresar el codigo de la factura.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- obtengo el codigo de la OT que voy a anular
		select "codOrdTrabajo" INTO Auxiliar FROM "OrdTrabajo" Where id="@id";
		
		--- grabo en el log
		PERFORM * FROM "FuncSeguridadLogEventos"('insert',NULL,NULL,NULL,"@usuarioGrab","@codOperacionInterna",'FACTURACION DE ORDEN DE TRABAJO','Codigo: ' || Auxiliar || ',	Observaciones: ' || "@paramAux");
		
		--- actualizo el estado
		UPDATE "OrdTrabajo" SET "estado"='FACTURADA' WHERE "id"="@id";
		
		--- retorno el resultado		
		RETURN	QUERY
		SELECT	"id","fechaGrab","usuarioGrab","activo","codOrdTrabajo","codOperacionInterna","codResponsable","codMaeOperacionTipo","codMaeOperacionPuerto","codMaeCliente1","codMaeCliente2","fechaRegistro","estado","codFactura","valorFactura","consignatario","codMaeOperacionIdent","numero","codMaeContenedorTipo","codMaeMercanciaTipo","observaciones","codMaeContenedorTamano","cantidad"
		FROM	"OrdTrabajo"
		WHERE	"id"="@id";
	RETURN;
	END IF;


	/*ANULAR OT*/
	IF "@OP"='anularOrdTrabajoById' THEN
		--- verifico las observaciones
		IF trim("@paramAux")='' THEN
			Auxiliar = 'Debe Digitar las observaciones, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- verifico el estado de la orden
		IF NOT EXISTS (SELECT 1 FROM "OrdTrabajo" WHERE "id"="@id" and "estado"='ACTIVA') THEN
			Auxiliar = 'La orden de Trabajo debe estar ACTIVA, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- obtengo el codigo de la OT que voy a anular
		select "codOrdTrabajo" INTO Auxiliar FROM "OrdTrabajo" Where id="@id";
		
		--- grabo en el log
		PERFORM * FROM "FuncSeguridadLogEventos"('insert',NULL,NULL,NULL,"@usuarioGrab","@codOperacionInterna",'ANULACION DE ORDEN DE TRABAJO','Codigo: ' || Auxiliar || ',	Observaciones: ' || "@paramAux");
		
		--- actualizo el estado
		UPDATE "OrdTrabajo" SET "estado"='ANULADA' WHERE "id"="@id";
		
		--- retorno el resultado		
		RETURN	QUERY
		SELECT	"id","fechaGrab","usuarioGrab","activo","codOrdTrabajo","codOperacionInterna","codResponsable","codMaeOperacionTipo","codMaeOperacionPuerto","codMaeCliente1","codMaeCliente2","fechaRegistro","estado","codFactura","valorFactura","consignatario","codMaeOperacionIdent","numero","codMaeContenedorTipo","codMaeMercanciaTipo","observaciones","codMaeContenedorTamano","cantidad"
		FROM	"OrdTrabajo"
		WHERE	"id"="@id";
	RETURN;
	END IF;


	/*CERRAR OT*/
	IF "@OP"='cerrarOrdTrabajoById' THEN
		--- verifico las observaciones
/*
		IF trim("@paramAux")='' THEN
			Auxiliar = 'Debe Digitar las observaciones, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
*/

		--- verifico el estado de la orden
		IF NOT EXISTS (SELECT 1 FROM "OrdTrabajo" WHERE "id"="@id" and "estado"='ACTIVA') THEN
			Auxiliar = 'La orden de Trabajo debe estar ACTIVA, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- obtengo el codigo de la OT que voy a anular
		select "codOrdTrabajo" INTO Auxiliar FROM "OrdTrabajo" Where id="@id";
		
		--- grabo en el log
		PERFORM * FROM "FuncSeguridadLogEventos"('insert',NULL,NULL,NULL,"@usuarioGrab","@codOperacionInterna",'CIERRE DE ORDEN DE TRABAJO','Codigo: ' || Auxiliar || ',	Observaciones: ' || coalesce("@paramAux",''));
		
		--- actualizo el estado
		UPDATE "OrdTrabajo" SET "estado"='CERRADA' WHERE "id"="@id";
		
		--- retorno el resultado		
		RETURN	QUERY
		SELECT	"id","fechaGrab","usuarioGrab","activo","codOrdTrabajo","codOperacionInterna","codResponsable","codMaeOperacionTipo","codMaeOperacionPuerto","codMaeCliente1","codMaeCliente2","fechaRegistro","estado","codFactura","valorFactura","consignatario","codMaeOperacionIdent","numero","codMaeContenedorTipo","codMaeMercanciaTipo","observaciones","codMaeContenedorTamano","cantidad"
		FROM	"OrdTrabajo"
		WHERE	"id"="@id";
	RETURN;
	END IF;

	/*SELECT BY ID*/
	IF "@OP"='selectById' THEN
		RETURN	QUERY
		SELECT	"id","fechaGrab","usuarioGrab","activo","codOrdTrabajo","codOperacionInterna","codResponsable","codMaeOperacionTipo","codMaeOperacionPuerto","codMaeCliente1","codMaeCliente2","fechaRegistro","estado","codFactura","valorFactura","consignatario","codMaeOperacionIdent","numero","codMaeContenedorTipo","codMaeMercanciaTipo","observaciones","codMaeContenedorTamano","cantidad"
		FROM	"OrdTrabajo"
		WHERE	"id"="@id";
	RETURN;
	END IF;

	/*SELECT BY CODIGO*/
	IF "@OP"='selectByCodigo' THEN
		RETURN	QUERY
		SELECT	"id","fechaGrab","usuarioGrab","activo","codOrdTrabajo","codOperacionInterna","codResponsable","codMaeOperacionTipo","codMaeOperacionPuerto","codMaeCliente1","codMaeCliente2","fechaRegistro","estado","codFactura","valorFactura","consignatario","codMaeOperacionIdent","numero","codMaeContenedorTipo","codMaeMercanciaTipo","observaciones","codMaeContenedorTamano","cantidad"
		FROM	"OrdTrabajo"
		WHERE	"codOrdTrabajo"="@codOrdTrabajo";
	RETURN;
	END IF;

	/*SELECT TODOS*/
	IF "@OP"='selectAll' THEN
		--- obtengo la pagina
		pagina = coalesce(CAST((string_to_array("@paramAux",'|'))[1] as INTEGER),0); 
		--- obtengo el numero de registros por pagina
		numRegistrosPorPagina = coalesce(CAST((string_to_array("@paramAux",'|'))[2] as INTEGER),-1); 
		--- obtengo el campo por el cual se ordenara y filtrara la info
		campoFiltroOrden = coalesce(trim((string_to_array("@paramAux",'|'))[3]),''); 
		--- obtengo el valor con el cual se realizara el filtro (sino se selecciono ningun campo, inicializo el valor con '')
		valorFiltro = CASE WHEN campoFiltroOrden='' THEN '' ELSE coalesce(trim((string_to_array("@paramAux",'|'))[4]),'') END;

		-- Verifico si el usuario tiene rol de CLIENTE
		isCliente=(EXISTS (select * from "SeguridadUsuarioRol" where "codUsuario"="@usuarioGrab" AND "codRol"=(select valor FROM "SeguridadParametro" where "codParametro"='rolClientes')));
			
		
		if valorFiltro<>'' THEN
			IF campoFiltroOrden='activo' THEN
				--- si se selecciono el campo "activo", formateo el campo valor (true, false)
				valorFiltro=CASE WHEN lower(valorFiltro)='si' OR lower(valorFiltro)='s' THEN 'true'  WHEN lower(valorFiltro)='no' OR lower(valorFiltro)='n' THEN 'false' ELSE '' END;
			ELSE
				--- si se definio un valor para filtrar, le agrego los caracteres de comodin para que la busqueda sea mas flexible
				
				valorFiltro= '%' ||  valorFiltro || '%';
			END IF;
				
		END IF;
		
		--- con esta sentencia muestro todos los resultados de la tabla
		if numRegistrosPorPagina<0 then 
			numRegistrosPorPagina=1000000;
		end if;

		
		RETURN	QUERY
		SELECT	t1."id",t1."fechaGrab",t1."usuarioGrab",t1."activo",t1."codOrdTrabajo",t1."codOperacionInterna",t1."codResponsable",t1."codMaeOperacionTipo",t1."codMaeOperacionPuerto",t1."codMaeCliente1",t1."codMaeCliente2",t1."fechaRegistro",t1."estado",t1."codFactura",t1."valorFactura",t1."consignatario",t1."codMaeOperacionIdent",t1."numero",t1."codMaeContenedorTipo",t1."codMaeMercanciaTipo",t1."observaciones",t1."codMaeContenedorTamano","cantidad"
		FROM	
			"OrdTrabajo" t1
			left JOIN "MaeCliente" clie1 ON t1."codMaeCliente1"=clie1."codMaeCliente"
			left JOIN "MaeCliente" clie2 ON t1."codMaeCliente2"=clie2."codMaeCliente"
			left JOIN "MaeOperacionPuerto" puert ON t1."codMaeOperacionPuerto"=puert."codMaeOperacionPuerto"
			
		WHERE
			(
				(valorFiltro<>'' AND campoFiltroOrden='codOrdTrabajo' AND t1."codOrdTrabajo" ILIKE valorFiltro)
				OR
				(valorFiltro<>'' AND campoFiltroOrden='codOperacionInterna' AND t1."codOperacionInterna" ILIKE valorFiltro)
				OR
				(valorFiltro<>'' AND campoFiltroOrden='consignatario' AND coalesce(t1."consignatario",'') ILIKE valorFiltro)
				OR
				(valorFiltro<>'' AND campoFiltroOrden='nombreMaeCliente1' AND coalesce(clie1."nombreMaeCliente",'') ILIKE valorFiltro)
				OR
				(valorFiltro<>'' AND campoFiltroOrden='nombreMaeCliente2' AND coalesce(clie2."nombreMaeCliente",'') ILIKE valorFiltro)
				OR
				(valorFiltro<>'' AND campoFiltroOrden='nombreMaeOperacionPuerto' AND coalesce(puert."nombreMaeOperacionPuerto",'') ILIKE valorFiltro)
				OR
				(valorFiltro<>'' AND campoFiltroOrden='estado' AND t1."estado" ILIKE valorFiltro)
				OR
				valorFiltro=''
			)
			AND
			(
				(isCLiente AND t1."codMaeCliente1"="@usuarioGrab")
				OR
				NOT isCLiente	
			)
		ORDER BY 
			CASE
				--WHEN campoFiltroOrden='codOrdTrabajo' THEN t1."codOrdTrabajo"
				WHEN campoFiltroOrden='codOperacionInterna' THEN t1."codOperacionInterna"
				WHEN campoFiltroOrden='consignatario' THEN t1."consignatario"
				WHEN campoFiltroOrden='nombreMaeCliente1' THEN coalesce(clie1."nombreMaeCliente",'')
				WHEN campoFiltroOrden='nombreMaeCliente2' THEN coalesce(clie2."nombreMaeCliente",'')
				WHEN campoFiltroOrden='nombreMaeOperacionPuerto' THEN coalesce(puert."nombreMaeOperacionPuerto",'')
				WHEN campoFiltroOrden='estado' THEN t1."estado"
			END ASC
		       ,"codOrdTrabajo" DESC
		LIMIT 
			numRegistrosPorPagina 
		OFFSET 
			numRegistrosPorPagina*pagina;
	RETURN;
	END IF;

	/*INSERTAR NUEVO REGISTRO*/
	IF "@OP"='insert' THEN

		--- verifico ques e haya digitado un codigo de OT valido
		IF "@codOperacionInterna"='' THEN
			Auxiliar = 'Digite un codigo de O.T. valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Verifico que no exista con ese OperacionInterna
		IF EXISTS (SELECT 1 FROM "OrdTrabajo" WHERE "codOperacionInterna"="@codOperacionInterna") THEN
			Auxiliar = 'Ya existe una orden de trabajo con el codigo de Operacion Interna "' || "@codOperacionInterna" || '", verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- verifico que exista el reponsable
		IF "@codResponsable" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "SeguridadUsuario" WHERE "codUsuario"="@codResponsable") THEN
			Auxiliar = 'El Supervisor seleccionado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		
		--- verifico que el reponsable selecciona este ACTIVO
		IF "@codResponsable" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "SeguridadUsuario" WHERE "codUsuario"="@codResponsable" and activo=true) THEN
			Auxiliar = 'El Supervidor seleccionado NO ESTA ACTIVO, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- verifico que exista el tipo de operacion
		IF "@codMaeOperacionTipo" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "MaeOperacionTipo" WHERE "codMaeOperacionTipo"="@codMaeOperacionTipo") THEN
			Auxiliar = 'El tipo de operacion seleccionado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		--- verifico que el tipo de operacion seleccionado este ACTIVO
		IF "@codMaeOperacionTipo" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "MaeOperacionTipo" WHERE "codMaeOperacionTipo"="@codMaeOperacionTipo" and activo=true) THEN
			Auxiliar = 'El Tipo de Operacion seleccionado NO ESTA ACTIVO, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- verifico que exista el puerto de operacion
		IF "@codMaeOperacionPuerto" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "MaeOperacionPuerto" WHERE "codMaeOperacionPuerto"="@codMaeOperacionPuerto") THEN
			Auxiliar = 'El Puerto de operacion seleccionado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		--- verifico que el puerto de operacion seleccionado este ACTIVO
		IF "@codMaeOperacionPuerto" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "MaeOperacionPuerto" WHERE "codMaeOperacionPuerto"="@codMaeOperacionPuerto" and activo=true) THEN
			Auxiliar = 'El Puerto de Operacion seleccionado NO ESTA ACTIVO, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- verifico que exista el cliente 1
		IF NOT EXISTS (SELECT 1 FROM "MaeCliente" WHERE "codMaeCliente"="@codMaeCliente1") THEN
			Auxiliar = 'La "Agencia de aduana" seleccionada NO es valida, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		--- verifico que el CLiente Principal seleccionado este ACTIVO
		IF NOT EXISTS (SELECT 1 FROM "MaeCliente" WHERE "codMaeCliente"="@codMaeCliente1" and activo=true) THEN
			Auxiliar = 'La "Agencia de aduana" seleccionada NO ESTA ACTIVA, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- verifico que exista el cliente 2
		IF "@codMaeCliente2" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "MaeCliente" WHERE "codMaeCliente"="@codMaeCliente2") THEN
			Auxiliar = 'El "Consignatario" seleccionado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		--- verifico que el CLiente Secundario seleccionado este ACTIVO
		IF "@codMaeCliente2" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "MaeCliente" WHERE "codMaeCliente"="@codMaeCliente2" and activo=true) THEN
			Auxiliar = 'El "Consignatario" seleccionado NO ESTA ACTIVO, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- verifico que el CLiente Principal y Secundario Sean distintos
		IF "@codMaeCliente2" IS NOT NULL THEN
			IF "@codMaeCliente1"="@codMaeCliente2" THEN			
				Auxiliar = 'El Cliente Principal y Secundario Deben ser distintos, verifique.';
				RAISE EXCEPTION '%', Auxiliar;
			END IF;
		END IF;


		--- verifico que exista la identificacion de operacion
		IF "@codMaeOperacionIdent" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "MaeOperacionIdent" WHERE "codMaeOperacionIdent"="@codMaeOperacionIdent") THEN
			Auxiliar = 'La Identificacion de operacion seleccionado NO es valida, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		--- verifico que el identificacion de operacion seleccionado este ACTIVO
		IF "@codMaeOperacionIdent" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "MaeOperacionIdent" WHERE "codMaeOperacionIdent"="@codMaeOperacionIdent" and activo=true) THEN
			Auxiliar = 'La Identificacion de Operacion seleccionado NO ESTA ACTIVO, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- verifico que exista la Tipo de Contenedor
		IF "@codMaeContenedorTipo" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "MaeContenedorTipo" WHERE "codMaeContenedorTipo"="@codMaeContenedorTipo") THEN
			Auxiliar = 'El tipo de contenedor seleccionado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		--- verifico que el identificacion de operacion seleccionado este ACTIVO
		IF "@codMaeContenedorTipo" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "MaeContenedorTipo" WHERE "codMaeContenedorTipo"="@codMaeContenedorTipo" and activo=true) THEN
			Auxiliar = 'El tipo de Contenedor seleccionado NO ESTA ACTIVO, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- verifico que exista la Tipo de Mercancia
		IF "@codMaeMercanciaTipo" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "MaeMercanciaTipo" WHERE "codMaeMercanciaTipo"="@codMaeMercanciaTipo") THEN
			Auxiliar = 'El Tipo de Mercancia seleccionado NO es valida, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- verifico que el Tipo de Mercancia seleccionado este ACTIVO
		IF "@codMaeMercanciaTipo" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "MaeMercanciaTipo" WHERE "codMaeMercanciaTipo"="@codMaeMercanciaTipo" and activo=true) THEN
			Auxiliar = 'El Tipo de Mercancia seleccionado NO ESTA ACTIVO, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		/*
		--- verifico que se haya digitado un numero valido
		IF "@numero"='' THEN
			Auxiliar = 'Digite un Numero/Placa valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		*/
		--- verifico que se haya digitado una cantidad valida
		IF "@cantidad"<0 THEN
			Auxiliar = 'La cantidad no puede ser negativa, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;



		-- Obtengo el siguiente consecutivo de la OT
		Auxiliar = "FuncSeguridadConsecutivo"('getNextConsecutivo','OrdTrabajo');
		

		
		-- Grabo el registro
		INSERT INTO "OrdTrabajo" ("usuarioGrab","usuarioUltMod","activo","codOrdTrabajo","codOperacionInterna","codResponsable","codMaeOperacionTipo","codMaeOperacionPuerto","codMaeCliente1","codMaeCliente2","fechaRegistro","estado","consignatario","codMaeOperacionIdent","numero","codMaeContenedorTipo","codMaeMercanciaTipo","observaciones","codMaeContenedorTamano","cantidad")
		VALUES	 ("@usuarioGrab","@usuarioGrab",coalesce("@activo",TRUE),Auxiliar,"@codOperacionInterna","@codResponsable","@codMaeOperacionTipo","@codMaeOperacionPuerto","@codMaeCliente1","@codMaeCliente2",coalesce("@fechaRegistro",now()),"@estado","@consignatario","@codMaeOperacionIdent","@numero","@codMaeContenedorTipo","@codMaeMercanciaTipo","@observaciones","@codMaeContenedorTamano","@cantidad");

		RETURN	QUERY
		SELECT	"id","fechaGrab","usuarioGrab","activo","codOrdTrabajo","codOperacionInterna","codResponsable","codMaeOperacionTipo","codMaeOperacionPuerto","codMaeCliente1","codMaeCliente2","fechaRegistro","estado","codFactura","valorFactura","consignatario","codMaeOperacionIdent","numero","codMaeContenedorTipo","codMaeMercanciaTipo","observaciones","codMaeContenedorTamano","cantidad"
		FROM	"OrdTrabajo"
		ORDER BY id DESC LIMIT 1;

	RETURN;
	END IF;

	/*ACTUALIZAR REGISTRO*/
	IF "@OP"='update' THEN
		--- Verifico que no exista con ese NOMBRE
		IF EXISTS (SELECT 1 FROM "OrdTrabajo" WHERE "codOperacionInterna"="@codOperacionInterna" and "id"<>"@id") THEN
			Auxiliar = 'Existe otra orden de trabajo con el codigo de Operacion Interna "' || "@codOperacionInterna" || '", verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- verifico ques e haya digitado un codigo de OT valido
		IF "@codOrdTrabajo"='' THEN
			Auxiliar = 'Digite un codigo de O.T. valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- verifico ques e haya digitado un codigo de OT valido
		IF "@codOperacionInterna"='' THEN
			Auxiliar = 'Digite un codigo de O.T. valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- verifico que exista el reponsable
		IF "@codResponsable" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "SeguridadUsuario" WHERE "codUsuario"="@codResponsable") THEN
			Auxiliar = 'El Supervisor seleccionado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;		
		--- verifico que el reponsable selecciona este ACTIVO
		IF "@codResponsable" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "SeguridadUsuario" WHERE "codUsuario"="@codResponsable" and activo=true) THEN
			Auxiliar = 'El Supervidor seleccionado NO ESTA ACTIVO, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- verifico que exista el tipo de operacion
		IF "@codMaeOperacionTipo" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "MaeOperacionTipo" WHERE "codMaeOperacionTipo"="@codMaeOperacionTipo") THEN
			Auxiliar = 'El tipo de operacion seleccionado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		--- verifico que el tipo de operacion seleccionado este ACTIVO
		IF "@codMaeOperacionTipo" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "MaeOperacionTipo" WHERE "codMaeOperacionTipo"="@codMaeOperacionTipo" and activo=true) THEN
			Auxiliar = 'El Tipo de Operacion seleccionado NO ESTA ACTIVO, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- verifico que exista el puerto de operacion
		IF "@codMaeOperacionPuerto" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "MaeOperacionPuerto" WHERE "codMaeOperacionPuerto"="@codMaeOperacionPuerto") THEN
			Auxiliar = 'El Puerto de operacion seleccionado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		--- verifico que el puerto de operacion seleccionado este ACTIVO
		IF "@codMaeOperacionPuerto" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "MaeOperacionPuerto" WHERE "codMaeOperacionPuerto"="@codMaeOperacionPuerto" and activo=true) THEN
			Auxiliar = 'El Puerto de Operacion seleccionado NO ESTA ACTIVO, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- verifico que exista el cliente 1
		IF NOT EXISTS (SELECT 1 FROM "MaeCliente" WHERE "codMaeCliente"="@codMaeCliente1") THEN
			Auxiliar = 'El "Cliente principal" seleccionado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		--- verifico que el CLiente Principal seleccionado este ACTIVO
		IF NOT EXISTS (SELECT 1 FROM "MaeCliente" WHERE "codMaeCliente"="@codMaeCliente1" and activo=true) THEN
			Auxiliar = 'El Cliente Principal seleccionado NO ESTA ACTIVO, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- verifico que exista el cliente 2
		IF "@codMaeCliente2" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "MaeCliente" WHERE "codMaeCliente"="@codMaeCliente2") THEN
			Auxiliar = 'El "Cliente Secundario" seleccionado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		--- verifico que el CLiente Secundario seleccionado este ACTIVO
		IF "@codMaeCliente2" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "MaeCliente" WHERE "codMaeCliente"="@codMaeCliente2" and activo=true) THEN
			Auxiliar = 'El Cliente Secundario seleccionado NO ESTA ACTIVO, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- verifico que el CLiente Principal y Secundario Sean distintos
		IF "@codMaeCliente2" IS NOT NULL THEN
			IF "@codMaeCliente1"="@codMaeCliente2" THEN			
				Auxiliar = 'El Cliente Principal y Secundario Deben ser distintos, verifique.';
				RAISE EXCEPTION '%', Auxiliar;
			END IF;
		END IF;

		--- verifico que exista la identificacion de operacion
		IF "@codMaeOperacionIdent" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "MaeOperacionIdent" WHERE "codMaeOperacionIdent"="@codMaeOperacionIdent") THEN
			Auxiliar = 'La Identificacion de operacion seleccionado NO es valida, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		--- verifico que el identificacion de operacion seleccionado este ACTIVO
		IF "@codMaeOperacionIdent" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "MaeOperacionIdent" WHERE "codMaeOperacionIdent"="@codMaeOperacionIdent" and activo=true) THEN
			Auxiliar = 'La Identificacion de Operacion seleccionado NO ESTA ACTIVO, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- verifico que exista la Tipo de Contenedor
		IF "@codMaeContenedorTipo" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "MaeContenedorTipo" WHERE "codMaeContenedorTipo"="@codMaeContenedorTipo") THEN
			Auxiliar = 'El tipo de contenedor seleccionado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		--- verifico que el identificacion de operacion seleccionado este ACTIVO
		IF "@codMaeContenedorTipo" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "MaeContenedorTipo" WHERE "codMaeContenedorTipo"="@codMaeContenedorTipo" and activo=true) THEN
			Auxiliar = 'El tipo de Contenedor seleccionado NO ESTA ACTIVO, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- verifico que exista la Tipo de Mercancia
		IF "@codMaeMercanciaTipo" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "MaeMercanciaTipo" WHERE "codMaeMercanciaTipo"="@codMaeMercanciaTipo") THEN
			Auxiliar = 'El Tipo de Mercancia seleccionado NO es valida, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		--- verifico que el Tipo de Mercancia seleccionado este ACTIVO
		IF "@codMaeMercanciaTipo" IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "MaeMercanciaTipo" WHERE "codMaeMercanciaTipo"="@codMaeMercanciaTipo" and activo=true) THEN
			Auxiliar = 'El Tipo de Mercancia seleccionado NO ESTA ACTIVO, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		/*
		--- verifico que se haya digitado un numero valido
		IF "@numero"='' THEN
			Auxiliar = 'Digite un Numero/Placa valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		*/
		
		--- verifico que se haya digitado una cantidad valida
		IF "@cantidad"<0 THEN
			Auxiliar = 'La cantidad no puede ser negativa, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;


		--- si se va a cambiar el codigo,Verifico que no se encuentre en uso
		IF 
			EXISTS (SELECT 1 FROM "OrdTrabajo" WHERE "codOrdTrabajo"<>"@codOrdTrabajo" and "id"="@id")
			AND
			(
			EXISTS (SELECT 1 FROM "OrdTrabajoEstibador" t1 inner join "OrdTrabajo" t2 on t1."codOrdTrabajo"=t2."codOrdTrabajo" and t2.id="@id") 
			OR
			EXISTS (SELECT 1 FROM "OrdTrabajoRecMercancia" t1 inner join "OrdTrabajo" t2 on t1."codOrdTrabajo"=t2."codOrdTrabajo" and t2.id="@id") 
			OR
			EXISTS (SELECT 1 FROM "OrdTrabajoRecMercanciaItem" t1 inner join "OrdTrabajo" t2 on t1."codOrdTrabajo"=t2."codOrdTrabajo" and t2.id="@id") 
			OR
			EXISTS (SELECT 1 FROM "OrdTrabajoServicio" t1 inner join "OrdTrabajo" t2 on t1."codOrdTrabajo"=t2."codOrdTrabajo" and t2.id="@id") 
			)
		THEN
			Auxiliar = 'La O.T. con codigo "' || "@codOrdTrabajo" || '" Ya se encuentra en uso, NO puede cambiar el codigo.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Actualizo el registro
		UPDATE	
			"OrdTrabajo" 
		SET	
			 "activo"=coalesce("@activo","activo")
			,"fechaUltMod"=NOW() 
			,"usuarioUltMod"="@usuarioGrab" 
			,"codOrdTrabajo"="@codOrdTrabajo"
			,"codOperacionInterna"="@codOperacionInterna"			
			,"codResponsable"="@codResponsable"			
			,"codMaeOperacionTipo"="@codMaeOperacionTipo"			
			,"codMaeOperacionPuerto"="@codMaeOperacionPuerto"			
			,"codMaeCliente1"="@codMaeCliente1"			
			,"codMaeCliente2"="@codMaeCliente2"			
			,"fechaRegistro"=coalesce("@fechaRegistro",now())--"@fechaRegistro"			
			--,"estado"="@estado"
			--,"codFactura"="@codFactura"
			--,"valorFactura"="@valorFactura"
			,"consignatario"="@consignatario"
			,"codMaeOperacionIdent"="@codMaeOperacionIdent"			
			,"numero"="@numero"			
			,"codMaeContenedorTipo"="@codMaeContenedorTipo"			
			,"codMaeMercanciaTipo"="@codMaeMercanciaTipo"			
			,"observaciones"="@observaciones"
			,"codMaeContenedorTamano"="@codMaeContenedorTamano"
			,"cantidad"="@cantidad"
		WHERE	
			"id"="@id";

	RETURN;
	END IF;

	/*ELIMINAR REGISTRO*/
	IF "@OP"='delete' THEN
		
		--- Verifico que no se encuentre en uso
		IF 
			EXISTS (SELECT 1 FROM "OrdTrabajoEstibador" t1 inner join "OrdTrabajo" t2 on t1."codOrdTrabajo"=t2."codOrdTrabajo" and t2.id="@id") 
			OR
			EXISTS (SELECT 1 FROM "OrdTrabajoRecMercancia" t1 inner join "OrdTrabajo" t2 on t1."codOrdTrabajo"=t2."codOrdTrabajo" and t2.id="@id") 
			OR
			EXISTS (SELECT 1 FROM "OrdTrabajoRecMercanciaItem" t1 inner join "OrdTrabajo" t2 on t1."codOrdTrabajo"=t2."codOrdTrabajo" and t2.id="@id") 
			OR
			EXISTS (SELECT 1 FROM "OrdTrabajoServicio" t1 inner join "OrdTrabajo" t2 on t1."codOrdTrabajo"=t2."codOrdTrabajo" and t2.id="@id") 
		THEN
			Auxiliar = 'La O.T. ya se encuentra en uso, NO puede ser eliminado.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--  Revierto el consecutivo si corresponde
		Auxiliar = "FuncSeguridadConsecutivo"('getCurrentConsecutivo','OrdTrabajo');
		IF "@paramAux" = Auxiliar THEN
			UPDATE "SeguridadConsecutivo" SET "proximoConsecutivo"="proximoConsecutivo"-1 WHERE "codConsecutivo"='OrdTrabajo';
		END IF;
		
		--- Borro el registro
		DELETE FROM "OrdTrabajo" 
		WHERE "id"="@id";

	RETURN;
	END IF;


--- Controlo que se haya digitado el OP correctamente
IF "@OP" IS NOT NULL THEN
	Auxiliar = 'El OP "' || "@OP" || '" No existe, verifique.';
	RAISE EXCEPTION '%', Auxiliar;
RETURN;
END IF;
END;
$$ LANGUAGE 'plpgsql';

